/*************************************************************************
	> File Name: 003.HZOJ331.Lost_cows.cpp
	> Author: Maureen 
	> Mail: Maureen@qq.com 
	> Created Time: 一  2/22 18:06:53 2021
 ************************************************************************/

/**
 *题目描述
有𝑛只小动物，每只都有一个独特的编号，分别从1到𝑛。现在他们从左到右依次排在一条直线上，顺序是乱的。​ 现在，我们只知道每个位置前面有几个比他小的数。请你根据给出的信息计算出每个位置上的数是多少。1≤𝑛≤80000。

输入
输入第一行是一个正整数𝑛，表示小动物的数量。​ 接下来𝑛−1 行有𝑛−1个数，第i个数表示在第𝑖+1个位置以前有多少个比第𝑖+1个位置上的数小的数。

输出
输出𝑛行，每行一个整数，表示对应位置小动物的编号。
 */

/**
 *分析：
模拟：最后一个数为0，即前面没有比它小的数，所以它是1；倒数第二个数为1，即在剩下的编号中只有1个是小于它的，所以它是3；其他位置同理可得。
第二个数为2，即在第3个位置前有2个比它小的数，解题思路就是在确定了最后两个位置的数后，在剩下的编号中排名第3的值就是第二个数。

如何表示剩余编号？ 又如何在剩余编号中找到排名第3的编号？
答：使用「标记数组」可表示剩余编号，使用「二分查找」可找到排名第3的编号。
先将标记数组中的每个元素的值初始化为1，表示每个编号都是可用的。
根据模拟规则，最后一个位置的为1，当1 被占用后，就将标记数组中下标为1处的元素值改为0；
倒数第二位用了3，则将标记数组中的下标为3处的元素值改为0。
即：如果某个值被占用了，就将标记数组中对应位置的元素值改为0。

接下来对标记数组求前缀和，前缀和数组中的元素值表示到该编号为止，是第几个可用的编号，即是剩下的编号中排名第几的编号。
这个前缀和数组是单调的，问题就变成了在单调数组中查找3这个值出现的位置，就是个二分问题。
使用树状数组可以快速地求解标记数组的前缀和问题。相同元素值中的第1个值表示可用的编号， 第2个表示相关编号被占用了。

总结来说：使用 树状数组+ 二分查找，在标记数组的前缀和数组上进行二分查找
 */

#include <iostream>
using namespace std;

#define lowbit(x) (x & -x)

#define MAX_N 80000
int c[MAX_N + 5];

void add(int i, int x, int n) {
    while (i <= n) {
        c[i] += x;
        i += lowbit(i);
    }
    return ;
}

int query(int i) {
    int sum = 0;
    while (i) {
        sum += c[i];
        i -= lowbit(i);
    }
    return sum;
}

int n;
int cnt[MAX_N + 5];
int ind[MAX_N + 5];

int binary_search(int n, int val) {
    int head = 1, tail = n;
    while (head < tail) {
        int mid = (head + tail) >> 1;
        if (query(mid) < val) head = mid + 1;
        else tail = mid;
    }
    return head;
}

void solve() {
    for (int i = n; i >= 1; i--) {
        //ind[i]表示找到的排名第cnt[i] + 1的值
        //cnt[i] + 1表示该位置的值排名第几
        ind[i] = binary_search(n, cnt[i] + 1);
        //将标记数组中对应位置的值-1,置为0
        add(ind[i],  -1, n);
    }
    return ;
}

void output() {
    for (int i = 1; i <= n; i++) {
        cout << ind[i] << endl;
    }
    return ;
}

int main() {
    cin >> n;
    cnt[1] = 0;
    for (int i = 2; i <= n; i++) cin >> cnt[i];
    for (int i = 1; i <= n; i++) {
        add(i, 1, n); //所有编号设置为1
    }
    solve();
    output();
    return 0;
}
